/**
 * 
 */
package com.jf.cloud.service.sysmanager.common.util;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * SQL工具类
 * 
 * @author 程伟平 2012-1-13
 */
public final class SqlUtil {

	/**
	 * 日志
	 */
	private static Log log = LogFactory.getLog(SqlUtil.class);

	public static String getWhereLikeSql(Map<String, String> conditions) {
		StringBuffer sb = new StringBuffer();

		if (conditions != null && conditions.keySet().size() > 0) {
			for (String key : conditions.keySet()) {
				if (key.endsWith("_SEARCH")) {
					if (sb.length() == 0) {
						sb.append("WHERE ");
						if (key.startsWith("LIKE_")) {
							sb.append(key.replaceAll("_SEARCH", "").replaceAll("LIKE_", ""));
							sb.append(" LIKE ? ");
						} else if (key.startsWith("NOT_")) {
							sb.append(key.replaceAll("_SEARCH", "").replaceAll("NOT_", ""));
							sb.append(" <> ? ");
						} else if (key.startsWith("DY_")) {
							sb.append(key.replaceAll("_SEARCH", "").replaceAll("DY_", ""));
							sb.append(" >= ? ");
						} else if (key.startsWith("XY_")) {
							sb.append(key.replaceAll("_SEARCH", "").replaceAll("XY_", ""));
							sb.append(" <= ? ");
						} else {
							sb.append(key.replaceAll("_SEARCH", ""));
							sb.append(" = ? ");
						}
					} else {
						sb.append("AND ");
						if (key.startsWith("LIKE_")) {
							sb.append(key.replaceAll("_SEARCH", "").replaceAll("LIKE_", ""));
							sb.append(" LIKE ? ");
						} else if (key.startsWith("NOT_")) {
							sb.append(key.replaceAll("_SEARCH", "").replaceAll("NOT_", ""));
							sb.append(" <> ? ");
						} else if (key.startsWith("DY_")) {
							sb.append(key.replaceAll("_SEARCH", "").replaceAll("DY_", ""));
							sb.append(" >= ? ");
						} else if (key.startsWith("XY_")) {
							sb.append(key.replaceAll("_SEARCH", "").replaceAll("XY_", ""));
							sb.append(" <= ? ");
						} else {
							sb.append(key.replaceAll("_SEARCH", ""));
							sb.append(" = ? ");
						}
					}
				}
			}
		}

		log.info("查询条件SQL语句：" + sb);

		return sb.toString();
	}

	/**
	 * 获取查询条件SQL语句（WHERE SQL）
	 * 
	 * @author 程伟平 2012-1-13
	 * @param conditions 查询条件 键为条件项（大写字段名+"_SEARCH"） 值为条件值
	 * @return 查询条件SQL语句
	 */
	public static String getWhereSql(Map<String, String> conditions) {
		StringBuffer sb = new StringBuffer();

		if (conditions != null && conditions.keySet().size() > 0) {
			StringBuffer orderBySQL = new StringBuffer();
			for (String key : conditions.keySet()) {
				if (key.endsWith("_SEARCH")) {
					if (sb.length() == 0) {
						sb.append("WHERE ");
						sb.append(key.replaceAll("_SEARCH", ""));
						sb.append(" = ? ");
					} else {
						sb.append("AND ");
						sb.append(key.replaceAll("_SEARCH", ""));
						sb.append(" = ? ");
					}
				} else if (key.equals("ORDER_BY_SQL")) {
					orderBySQL.append(conditions.get(key));
				}
			}
			sb.append(orderBySQL);
		}

		log.info("查询条件SQL语句：" + sb);

		return sb.toString();
	}

	/**
	 * 根据查询条件获取SQL语句参数列表
	 * 
	 * @author 程伟平 2012-1-13
	 * @param conditions 查询条件 键为条件项（大写字段名+"_SEARCH"） 值为条件值
	 * @return SQL语句参数列表
	 */
	private static List<String> getSqlArgs(Map<String, String> conditions) {
		List<String> args = new ArrayList<String>();
		if (conditions != null && conditions.keySet().size() > 0) {
			for (String key : conditions.keySet()) {
				if (key.endsWith("_SEARCH")) {
					args.add(conditions.get(key));
				}
			}
		}

		log.info("查询条件SQL语句参数：" + args);

		return args;
	}

	/**
	 * 获取查询条件SQL语句参数
	 * 
	 * @author 程伟平 2012-1-13
	 * @param conditions 查询条件 键为条件项（大写字段名+"_SEARCH"） 值为条件值
	 * @return 查询条件SQL语句参数
	 */
	public static Object[] getWhereSqlArgs(Map<String, String> conditions) {
		return getSqlArgs(conditions).toArray();
	}

	/**
	 * 获取查询条件SQL语句参数
	 * 
	 * @author 程伟平 2012-1-13
	 * @param startRow 起始行
	 * @param maxRows 最大行数
	 * @param conditions 查询条件 键为条件项（大写字段名+"_SEARCH"） 值为条件值
	 * @return 查询条件SQL语句参数
	 */
	public static Object[] getWhereSqlArgs(int startRow, int maxRows, Map<String, String> conditions) {
		List<Object> args = new ArrayList<Object>();
		args.addAll(SqlUtil.getSqlArgs(conditions));
		args.add(startRow);
		args.add(maxRows);
		log.info("分页参数：起始行=" + startRow + "，最大行数=" + maxRows);

		return args.toArray();
	}


}
